#!/bin/bash
# script name: 内网穿透 frp 部署脚本
# author: subushi
# update date: 2023.07.28

# 注意: 脚本启动后会删除 frp 配置文件中带 # 注释内容，因为配置文件不允许带中文字符，否则会报错
# 修改配置文件需执行 systemctl daemon-reload 重载单元，再执行 systemctl restart frps.service 重启服务
# 先在 服务端 启动frps，再到 客户端 启动frpc
# 如果 服务端 未启动，客户端 会处于 dead 状态

# 程序部署路径，当前默认是/home
route=/home
# 服务端公网IP
WAN=110.40.196.124
# 客户端内网IP
LAN=192.168.10.1

echo "select"
echo -e "\033[1;42;37m 1.配置 frps 服务端 \033[0m"
echo "--------------------------------------------"
echo -e "\033[1;42;37m 2.配置 frpc 客户端 \033[0m"

read -p "Input selection 1/2：" choice

case $choice in

  1)
# ---frps服务端(公网)---

# 下载 frp 程序包---(需挂代理)
cd $route
wget https://github.com/fatedier/frp/releases/download/v0.51.1/frp_0.51.1_linux_amd64.tar.gz

tar xf frp_0.51.1_linux_amd64.tar.gz     # 解压

mv frp_0.51.1_linux_amd64 frp && cd frp  # 修改名称
rm -rf  frpc  frpc.ini  frpc_full.ini    # 避免混淆，删除客户端配置


# 导入配置
cat <<EOF | tee $route/frp/frps.ini
[common]
bind_port = 7000
dashboard_port = 7500             # 仪表板访问端口
dashboard_user = admin            # 仪表板登录用户
dashboard_pwd = admin             # 仪表板登录密码
authentication_method = token     # 认证方式使用token
token = subushi                   # 设置token
EOF

echo "-------------------------------------------------"

# 配置 systemctl 来控制 frps 启动/停止
cat <<EOF | tee /lib/systemd/system/frps.service
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#启动服务命令,填写正确的目录和启动程序名称
ExecStart=$route/frp/frps -c $route/frp/frps.ini

[Install]
WantedBy=multi-user.target
EOF


# 启动后会删除配置文件中带#注释内容，否则会报错
sed -i 's/\s*#.*//' $route/frp/frps.ini
sed -i 's/\s*#.*//' /lib/systemd/system/frps.service


# 重载单元，使用 systemctl 启动frps
systemctl daemon-reload
systemctl start frps.service

echo "-------------------------------------------------"

echo -e "\033[1;42;37m 启动成功 \033[0m"
  ;;


  2)
# ---frpc客户端(内网)---

# 下载 frp 程序包---(需挂代理)
cd $route
wget https://github.com/fatedier/frp/releases/download/v0.51.1/frp_0.51.1_linux_amd64.tar.gz

tar xf frp_0.51.1_linux_amd64.tar.gz     # 解压

mv frp_0.51.1_linux_amd64 frp && cd frp  # 修改名称
rm -rf  frps  frps.ini  frps_full.ini    # 避免混淆，删除服务端配置


# 导入配置
cat <<EOF | tee $route/frp/frpc.ini
[common]
server_addr = $WAN             # 服务端IP
server_port = 7000             # 服务端port
token = subushi                # 连接token

[client]
type = tcp
local_ip = $LAN                # 客户端IP
local_port = 22                # SSH端口
remote_port = 6000             # 远程端口，默认为6000

[server]                       # 服务唯一标识，新增服务不可与该标识重复
type = tcp                     # 使用tcp协议
local_ip = $LAN                # 客户端IP
local_port = 8090              # 客户端(内网)服务访问端口
remote_port = 9500             # 穿透到服务端(公网)服务访问端口
EOF

echo "-------------------------------------------------"

# 配置 systemctl 来控制 frpc 启动/停止
cat <<EOF | tee /lib/systemd/system/frpc.service
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#启动服务命令,填写正确的目录和启动程序名称
ExecStart=$route/frp/frpc -c $route/frp/frpc.ini

[Install]
WantedBy=multi-user.target
EOF


# 启动后会删除配置文件中带#注释内容，否则会报错
sed -i 's/\s*#.*//' $route/frp/frpc.ini
sed -i 's/\s*#.*//' /lib/systemd/system/frpc.service


# 重载单元，使用 systemctl 启动frpc
systemctl daemon-reload
systemctl start frpc.service

echo "-------------------------------------------------"

echo -e "\033[1;42;37m 启动成功 \033[0m"
  ;;


  *)
  echo "Invalid selection"
  ;;
esac
